5.1 函数
函数可以说是各个编程语言都具备的东西,而在使用方面也是大同小异。
函数在我们的实际应用中是必须的一个东西,可以说是我们程序的重要组成部分。
本节将对函数进行详细讲解。
本节代码存放目录为 lesson13
什么是函数?
在我们之前的章节例子中,代码里面都会有func main()
,这就是一个主函数,在我们的程序中有且只能有一个。
我们之前的代码都写在了main
里面,那么如果我们的代码特别多的时候,这样显然是不行的。
一方面这样代码会写的很乱,一方面也不能达到我们的要求。
所以我们一般会将一些代码单独拿出来作为一部分,那么拿出来的这一部分我们就会单独写一个func
放进去。
这就是函数的简单理解。
函数定义
函数定义的规则是固定的,通过func
关键字进行声明。如下所示:
func printHello() {
fmt.Println("Hello!")
}
在上面的代码中,我们定义了一个函数,专门用于打印输出固定的字符串。
func
是一个固定的关键字,在声明函数的时候是必备的。
printHello
表示函数名称,在Go
语言中,同一个包下的函数名称必须是唯一的,这与其他语言有一些不同。
()
表示函数的参数,接下来我们会讲到。
{}
里面的就是函数体,这也是函数必备的内容。
那么我们应该如何调用呢?如下代码所示:
func main() {
printHello()
}
在上面的代码中,我们直接在main
函数中调用了printHello
函数,这样就实现了函数的调用。
结果输出如下:
Hello!
函数传参及返回值
刚刚我们讲到了函数简单的定义及调用,同时我们讲到了()
是作为函数传参的。
那么这是什么东西呢?在我们实际开发过程中,我们可能会有一些复杂的函数,比如说我们需要将打印的数据传进去,而不是固定的。
那么这种情况下我们就会需要使用到函数参数。如下代码所示:
func print(text string) {
fmt.Println(text)
}
在上面的代码中,我们可以看到,我们增加了一个text
参数,之后在函数体内进行了使用。
在调用方面,我们则可以这样:
print("我的参数内容")
结果输出如下:
我的参数内容
同样的,如果我们需要传递多个参数,那么我们可以这样:
func print1(text string, text2 string) {
fmt.Println(text)
fmt.Println(text2)
}
也可以简写为这样:
func print1(text, text2 string) {
fmt.Println(text)
fmt.Println(text2)
}
有的时候,我们需要在函数调用后得到一些值。
比如这个函数的作用是计算两个数字的和,那么计算后我们需要得到最终的结果。
所以这时候我们需要函数将值返回给我们。我们可以这样做:
func sum(a, b int) int {
return a + b
}
在调用的时候,我们需要接收这个返回值,我们可以这样做:
sumResult := sum(1, 2)
fmt.Println(sumResult)
在上面的代码中,我们在调用时传入了两个参数:1
、2
。
其中1
就表示第一个参数,2
表示第二个参数。
之后我们使用sumResult
来接收了函数计算的返回值。
我们还可以将上面的函数进行简写,如下所示:
func sum2(a, b int) (s int) {
s = a + b
return
}
在上面的代码中,我们在函数返回的地方直接定义了:(s int)
,这就表示已经将返回值声明为了s
,那么在底部只需要直接return
就可以了。
关于函数传参,还有一个比较特殊的地方,那就是Go
语言允许可变参
。
也就是说同一个类型,可以传递一个参数,也可以传递多个参数,如下所示:
func sum3(number ...int) (s int) {
for _, n := range number {
s += n
}
return
}
在上面的代码中,我们通过...
将参数作为了一个可变参
,可以传递一个参数进来,也可以传递很多个参数进来。
需要注意的是,一个函数只允许定一个可变参
。
调用方式如下所示,分别演示了传递一个参数与多个参数的调用方式:
fmt.Println(sum3(1))
fmt.Println(sum3(1, 2, 3))
函数作为参数
在Go
语言中,允许我们将一个函数作为另一个函数的参数传入。如下所示:
func funcParam(fn func(a, b int) int) int {
a := 1
b := 1
return fn(a, b)
}
在上面的代码中,我们定义了一个函数为funxParam
,同时将函数的参数定义为了一个函数。
函数接收两个int
类型的参数,返回一个int
类型的参数,在funcParam
中,我们直接使用fn
即可。
调用方式如下所示:
fmt.Println(funcParam(sum))
在上面的代码中,我们直接调用了funcParam
,同时将我们之前定义的sum
函数传递了进去。
需要注意的是,传入的函数参数、返回值,都需要与funcParam
定义的一致。
结果输出如下:
2
闭包
在Go
语言中,我们可以通过匿名函数作为闭包使用。实现方式如下所示:
sumFunc := func(a, b int) int {
return a + b
}
fmt.Println(sumFunc(1, 2))
fmt.Println(sumFunc(3, 4))
在上面的代码中,我们直接在main
中定义了一个求和函数,将其赋值给了变量sumFunc
。
在调用的时候,我们直接使用sumFunc
即可。
总的来说,也就是可以将函数作为一种类型进行声明使用。
小结
函数在我们的实际开发中是比较常用的,在之前我们还讲到了结构体方法,他们两者存在一些区别。
可以简单理解为,函数是独立的,而方法是与结构体进行关联的。
关于本节函数的讲解总结如下:
使用
func
进行函数定义函数名称开头不能是数字
可以传入多个参数
可以返回多个参数
可以使用可变参传递
函数参数可以传入函数
函数可以声明为一个变量进行使用